mirror of https://github.com/status-im/crvc.git
handle environment, ready for stdio communication
This commit is contained in:
parent
2da4d7efe4
commit
3c1e9d6394
|
@ -0,0 +1,3 @@
|
|||
nimcache
|
||||
bin
|
||||
src/crvc
|
|
@ -0,0 +1,14 @@
|
|||
# Package
|
||||
|
||||
version = "0.1.0"
|
||||
author = "Jarrad Hope"
|
||||
description = "Cryptoeconomic Release and Version Control"
|
||||
license = "MIT"
|
||||
srcDir = "src"
|
||||
binDir = "bin"
|
||||
bin = @["crvc"] # TODO rename to "git-remote-crvc" ?
|
||||
|
||||
|
||||
# Dependencies
|
||||
|
||||
requires "nim >= 0.19.0"
|
|
@ -0,0 +1,68 @@
|
|||
import os, strformat, strutils, rdstdin
|
||||
|
||||
const
|
||||
gitEnv = "GIT_DIR"
|
||||
protocol = "crvc"
|
||||
|
||||
proc setup(gitEnv: string, protocol: string): (string, string, string, string) =
|
||||
# Checks the Environment and returns the git Working directory, the protocol, the remote and url
|
||||
|
||||
if paramCount() < 2:
|
||||
raise newException(ValueError, fmt"Usage: {getAppFilename()} <remote-name> <url>")
|
||||
|
||||
let
|
||||
remote = paramStr(1) # <remote-name>
|
||||
url = paramStr(2) # <url>
|
||||
gitDir = getEnv(gitEnv)
|
||||
|
||||
# Check if GIT_DIR Environment Variable is set
|
||||
if gitDir.isNilOrWhitespace:
|
||||
raise newException(OSError, fmt"{gitEnv} is not set")
|
||||
|
||||
# Check if the .git directory exists
|
||||
if not existsDir(gitDir):
|
||||
raise newException(OSError, fmt"{gitDir} does not appear to be a git repository")
|
||||
|
||||
# Create our Working Directory if it doesn't exist
|
||||
let path = joinPath(gitDir, protocol, remote)
|
||||
if not existsDir(path):
|
||||
createDir(path)
|
||||
return (gitDir, protocol, remote, url) # I don't like result, too immutable
|
||||
|
||||
proc processStdio (env: tuple): void =
|
||||
# Supports the Git Remote Helper stdio protocol
|
||||
# https://git-scm.com/docs/git-remote-helpers
|
||||
let (gitDir, protocol, remote, url) = env
|
||||
|
||||
while true:
|
||||
var
|
||||
response: string
|
||||
line: string = readLine(stdin) # TODO something better here ? https://nim-lang.org/docs/streams.html
|
||||
# echo line
|
||||
|
||||
# Git sends the remote helper a list of commands on standard input, one per line.
|
||||
# The first command is always the capabilities command, in response to which the remote helper must print a list of the capabilities it supports followed by a blank line.
|
||||
case line:
|
||||
of "capabilities":
|
||||
response = "capabilities response"
|
||||
of "list":
|
||||
response = "list response"
|
||||
of "export":
|
||||
response = "export response"
|
||||
else:
|
||||
raise newException(IOError, fmt"Unrecognised command: {line}")
|
||||
write(stdout, response)
|
||||
|
||||
|
||||
proc bail() {.noconv.} =
|
||||
quit()
|
||||
|
||||
when isMainModule:
|
||||
setControlCHook(bail)
|
||||
|
||||
try:
|
||||
processStdio(setup(gitEnv, protocol))
|
||||
except:
|
||||
echo getCurrentExceptionMsg()
|
||||
finally:
|
||||
quit()
|
Loading…
Reference in New Issue