fossgit 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +4 -1
- data/bin/fossgit +47 -32
- data/lib/fossgit.rb +14 -2
- data/lib/fossgit/cli.rb +50 -28
- metadata +4 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3c99282d257c6859651f8f047352af6af3b5baaf
|
4
|
+
data.tar.gz: 4f1054d869c6f7af44e259d9807b36cb52d8a9d4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 881a6fd0ce1c6e9f0b4592269fbb3060e044a0aa3a8ddecca4d2b1a6e26a344e13e5e546eff10d926c41ec4e2b15a638c48284b02fab657dd082965d5e783656
|
7
|
+
data.tar.gz: 7ed9257abb9763d7af0ab6895fc14e132376e335335cd51c17edfae43d09eb9474b8a1be00a7cf182c44baf4c8217f455c0759cc14daff45200b5d7b06e82205
|
data/README.md
CHANGED
@@ -109,9 +109,12 @@ In order from most preferred to least preferred:
|
|
109
109
|
|
110
110
|
## Roadmap
|
111
111
|
|
112
|
-
* Add
|
112
|
+
* Add autovivifying functionality for a local Git mirror.
|
113
|
+
* Add autovivifying functionality for GitHub and GitLab remotes.
|
114
|
+
* Add more tests.
|
113
115
|
* Change defaults for v2.0, perhaps.
|
114
116
|
* Incorporate this functionality into FossRec, a more comprehensive tool.
|
117
|
+
* Organize lib APIs and document them. (Don't rely on undocumented APIs.)
|
115
118
|
|
116
119
|
[gem]: https://rubygems.org/gems/fossgit
|
117
120
|
[frepo]: https://fossrec.com/u/apotheon/fossgit
|
data/bin/fossgit
CHANGED
@@ -1,66 +1,81 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
require 'fossgit'
|
3
3
|
require 'fossgit/cli'
|
4
|
-
require 'yaml'
|
5
|
-
|
6
|
-
def projectname
|
7
|
-
fossil_info = YAML.load `fossil info | head -n 1`
|
8
|
-
name = fossil_info ? fossil_info['project-name'] : fossil_info
|
9
|
-
name if not name.eql? '<unnamed>'
|
10
|
-
end
|
11
4
|
|
12
5
|
@cli = CLI.new ARGV, File.basename($0)
|
13
|
-
@fg = FossGit.new (@cli.get_option('
|
6
|
+
@fg = FossGit.new (@cli.get_option('checkout') or Dir.pwd)
|
14
7
|
|
15
8
|
Dir.chdir @fg.checkout_path
|
16
9
|
|
17
|
-
if @cli.config['gitdir'] and
|
18
|
-
@cli.config['gitrepo']
|
10
|
+
if @cli.config['gitdir'] and @fg.project_name
|
11
|
+
@cli.config['gitrepo'] ||= File.join(@cli.config['gitdir'], @fg.project_name)
|
19
12
|
end
|
20
13
|
|
21
|
-
|
14
|
+
@cli.parse_switches %w(all help local newgit text-export version)
|
15
|
+
|
16
|
+
if @cli.switches['help']
|
22
17
|
puts @cli.help_text
|
23
18
|
exit
|
24
|
-
elsif @cli.
|
25
|
-
puts
|
26
|
-
elsif @cli.
|
19
|
+
elsif @cli.switches['version']
|
20
|
+
puts @cli.name + ' ' + FossGit.version
|
21
|
+
elsif @cli.switches['text-export']
|
27
22
|
system @fg.text_export_command
|
28
23
|
exit
|
29
24
|
else
|
30
|
-
|
31
|
-
|
25
|
+
if remotes = @cli.get_option('remotes')
|
26
|
+
remotes = remotes.split ','
|
27
|
+
end
|
32
28
|
|
33
|
-
|
29
|
+
### NO MORE OPTION PARSING
|
34
30
|
|
35
|
-
@cli.
|
31
|
+
gitrepo = (@cli.args.shift or @cli.config['gitrepo'])
|
36
32
|
|
37
|
-
remotes
|
33
|
+
unless remotes or @cli.switches['local']
|
34
|
+
if @cli.switches['all']
|
35
|
+
remotes = @fg.git_remotes(gitrepo)
|
36
|
+
elsif @cli.remotes and not @cli.switches['newgit']
|
37
|
+
remotes = (@cli.remotes == 'all') ? @fg.git_remotes(gitrepo) : @cli.remotes
|
38
|
+
else
|
39
|
+
remotes = ['origin']
|
40
|
+
end
|
41
|
+
end
|
38
42
|
|
39
|
-
|
43
|
+
hasgit = Dir.exist? gitrepo
|
40
44
|
|
41
45
|
if gitrepo.to_s.empty?
|
42
46
|
STDERR.puts 'Error! No Git path provided.'
|
43
47
|
exit!
|
44
|
-
elsif
|
48
|
+
elsif @cli.switches['newgit'] and gitrepo
|
49
|
+
if hasgit
|
50
|
+
STDERR.puts %Q{Error! Directory "#{gitrepo}" already exists.}
|
51
|
+
exit!
|
52
|
+
elsif Dir.mkdir gitrepo
|
53
|
+
Dir.chdir(gitrepo)
|
54
|
+
|
55
|
+
if `git init`.empty?
|
56
|
+
STDERR.puts %{Error! Cannot init Git within "#{gitrepo}".}
|
57
|
+
exit!
|
58
|
+
end
|
59
|
+
else
|
60
|
+
STDERR.puts %Q{Error! Cannot create directory "#{gitrepo}".}
|
61
|
+
exit!
|
62
|
+
end
|
63
|
+
elsif @cli.switches['newgit']
|
64
|
+
STDERR.puts %Q{Error! Name for new Git repository unknown.}
|
65
|
+
exit!
|
66
|
+
elsif hasgit
|
45
67
|
Dir.chdir gitrepo
|
46
68
|
else
|
47
69
|
STDERR.puts %Q{Error! Invalid Git path "#{gitrepo}" provided.}
|
48
70
|
exit!
|
49
71
|
end
|
50
72
|
|
51
|
-
if remotes
|
52
|
-
remotes = remotes.split ','
|
53
|
-
else
|
54
|
-
if opts[:all]
|
55
|
-
remotes = @fg.git_remotes gitrepo
|
56
|
-
else
|
57
|
-
remotes = ['origin']
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
73
|
if system 'git status'
|
62
|
-
if
|
74
|
+
if @cli.switches['local']
|
63
75
|
system @fg.mirror_command
|
76
|
+
elsif remotes.empty?
|
77
|
+
STDERR.print %Q{Error! Git repository "#{Dir.pwd}" has no remotes.}
|
78
|
+
exit!
|
64
79
|
else
|
65
80
|
@fg.push_remote_list! remotes
|
66
81
|
end
|
data/lib/fossgit.rb
CHANGED
@@ -1,16 +1,21 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
1
3
|
class FossGit
|
2
4
|
attr_reader :checkout_path
|
3
5
|
attr_reader :fossil_repository
|
6
|
+
attr_accessor :project_name
|
4
7
|
|
5
8
|
def initialize checkout_path=''
|
6
9
|
@checkout_path = checkout_path
|
7
10
|
@checkout_path = get_element_matching :'local-root'
|
8
11
|
|
9
12
|
@fossil_repository = get_repository_path
|
13
|
+
|
14
|
+
@project_name = get_project_name
|
10
15
|
end
|
11
16
|
|
12
17
|
def self.version
|
13
|
-
'1.
|
18
|
+
'1.2.0'
|
14
19
|
end
|
15
20
|
|
16
21
|
def fossil_marks
|
@@ -45,6 +50,7 @@ class FossGit
|
|
45
50
|
end
|
46
51
|
|
47
52
|
def sed_command
|
53
|
+
# legacy fix for a bug in an old Fossil version's Git-export
|
48
54
|
%q{sed 's/^\(committer \+\)\([^ ]\+@[^ ]\+\)\( *<\)\(\w\+\)\(>.*\)$/\1\4\3\2\5/'}
|
49
55
|
end
|
50
56
|
|
@@ -79,6 +85,12 @@ class FossGit
|
|
79
85
|
|
80
86
|
private
|
81
87
|
|
88
|
+
def get_project_name
|
89
|
+
fossil_info = YAML.load `fossil info | head -n 1`
|
90
|
+
name = fossil_info ? fossil_info['project-name'] : fossil_info
|
91
|
+
name if not name.eql? '<unnamed>'
|
92
|
+
end
|
93
|
+
|
82
94
|
def get_repository_path
|
83
95
|
File.absolute_path get_element_matching :repository
|
84
96
|
end
|
@@ -94,7 +106,7 @@ class FossGit
|
|
94
106
|
stat = `fossil status`
|
95
107
|
|
96
108
|
if stat.size > 0
|
97
|
-
stat.split
|
109
|
+
stat.split "\n"
|
98
110
|
else
|
99
111
|
raise ArgumentError, "#{checkout_path} is not a valid checkout path"
|
100
112
|
end
|
data/lib/fossgit/cli.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'yaml'
|
2
2
|
|
3
3
|
class CLI
|
4
|
-
attr_accessor :args, :config, :name
|
4
|
+
attr_accessor :args, :config, :name, :switches
|
5
5
|
|
6
6
|
def initialize args=[], cliname='fossgit', filename='.fossgit'
|
7
7
|
@args = args
|
@@ -12,6 +12,8 @@ class CLI
|
|
12
12
|
@home_config_file = File.join(Dir.home, @config_filename)
|
13
13
|
|
14
14
|
configure @config_filename
|
15
|
+
|
16
|
+
@switches = Hash.new
|
15
17
|
end
|
16
18
|
|
17
19
|
def configure file=@config_filename
|
@@ -51,7 +53,7 @@ class CLI
|
|
51
53
|
3. a Git repository to use as a mirror
|
52
54
|
|
53
55
|
USAGE: #{name} [-h | -v | -t]
|
54
|
-
#{name} [-c <CHECKOUT>] [-a | -r REMOTE | -l] [GITREPO]
|
56
|
+
#{name} [-c <CHECKOUT>] [-a | -r REMOTE | -l] [[-n] GITREPO]
|
55
57
|
|
56
58
|
By default, when exporting to local Git repository GITREPO, #{name}
|
57
59
|
attempts to push updates to a configured upstream Git repository. It
|
@@ -62,37 +64,53 @@ class CLI
|
|
62
64
|
|
63
65
|
OPTIONS/ARGUMENTS:
|
64
66
|
|
65
|
-
-h
|
66
|
-
|
67
|
+
-h | --help
|
68
|
+
|
69
|
+
Display this help text and exit, ignoring all other arguments.
|
70
|
+
|
71
|
+
-a | --all
|
72
|
+
|
73
|
+
Push to all configured remotes for the target Git repository.
|
74
|
+
Default is to push only to the configured "origin" remote.
|
75
|
+
|
76
|
+
-c <CHECKOUT> | --checkout <CHECKOUT>
|
67
77
|
|
68
|
-
|
69
|
-
|
70
|
-
|
78
|
+
Specify CHECKOUT, your Fossil repository's checkout location.
|
79
|
+
This is optional; you may simply use this tool from within an
|
80
|
+
open checkout of your Fossil repository instead.
|
71
81
|
|
72
|
-
-
|
73
|
-
checkout, CHECKOUT. This is optional; you may simply
|
74
|
-
use this tool from within an open checkout of your
|
75
|
-
Fossil repository instead.
|
82
|
+
-l | --local
|
76
83
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
repository whenever it exports from Fossil to Git.
|
84
|
+
Perform local-only mirror operations without pushing to a remote
|
85
|
+
Git repository. By default, #{name} pushes to an upstream Git
|
86
|
+
repository whenever it exports from Fossil to Git.
|
81
87
|
|
82
|
-
-
|
83
|
-
|
84
|
-
|
85
|
-
|
88
|
+
-n | --newgit
|
89
|
+
|
90
|
+
Create a local Git repository mirror when it does not already
|
91
|
+
exist. Use this option from the Fossil repository's directory
|
92
|
+
hierarchy root and specify the Git repository's location as for
|
93
|
+
updating a mirror via config file, GITREPO argument, or Fossil
|
94
|
+
project-name setting in `fossil info` output.
|
86
95
|
|
87
|
-
-
|
88
|
-
to Git. This overrides the `-l` switch and GITREPO
|
89
|
-
argument, if present.
|
96
|
+
-r | --remotes <COMMA,SEPARATED,REMOTES>
|
90
97
|
|
91
|
-
|
98
|
+
Specify which of the Git mirror's configured remotes to push in a
|
99
|
+
comma separated list with no spaces. This overrides `--all`.
|
92
100
|
|
93
|
-
|
94
|
-
|
95
|
-
|
101
|
+
-t | --text-export
|
102
|
+
|
103
|
+
Dump export to STDOUT as text rather than sending it to Git.
|
104
|
+
This overrides the `-l` switch and GITREPO argument, if present.
|
105
|
+
|
106
|
+
-v | --version
|
107
|
+
|
108
|
+
Show FossGit version number.
|
109
|
+
|
110
|
+
GITREPO
|
111
|
+
|
112
|
+
Specify the location of the local Git mirror, if there is no
|
113
|
+
configuration file specification or to override configuration.
|
96
114
|
|
97
115
|
COMMAND EXAMPLES:
|
98
116
|
|
@@ -149,8 +167,8 @@ class CLI
|
|
149
167
|
EOF
|
150
168
|
end
|
151
169
|
|
152
|
-
def get_option
|
153
|
-
if val = args.index
|
170
|
+
def get_option long_name, default=nil
|
171
|
+
if val = (args.index "-#{long_name[0]}" or args.index "--#{long_name}")
|
154
172
|
return (args.delete_at val and args.delete_at val)
|
155
173
|
else
|
156
174
|
return default
|
@@ -160,4 +178,8 @@ class CLI
|
|
160
178
|
def option_switch? long_name
|
161
179
|
args.delete "-#{long_name[0]}" or args.delete "--#{long_name}"
|
162
180
|
end
|
181
|
+
|
182
|
+
def parse_switches opts
|
183
|
+
opts.each {|opt| switches[opt] = option_switch? opt }
|
184
|
+
end
|
163
185
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fossgit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chad Perrin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-06-
|
11
|
+
date: 2019-06-27 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: " Maintain a presence in Git hosting for Fossil project mirrors.\n"
|
14
14
|
email: code@apotheon.net
|
@@ -34,9 +34,8 @@ post_install_message: |2
|
|
34
34
|
* Git (the world's most popular DVCS)
|
35
35
|
* sed (standard on Unix-like systems)
|
36
36
|
|
37
|
-
This update adds support for
|
38
|
-
|
39
|
-
that is a bug, and you are encouraged to report it at:
|
37
|
+
This update adds support for a full range of long options and for an option
|
38
|
+
to create a new local Git mirror on the fly. Please report bugs at:
|
40
39
|
|
41
40
|
https://fossrec.com/u/apotheon/fossgit/index.cgi/reportlist
|
42
41
|
|