clone_git_file 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +28 -12
- data/exe/clone_git_file +61 -6
- data/lib/clone_git_file.rb +33 -3
- data/lib/clone_git_file/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a6a43dd0a36bfccd6e5c32722a835ecc6ceeac55
|
4
|
+
data.tar.gz: d1fd69615798975cc626c7a135e25d802d75a437
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0ab9272637734ae7ae03b0ab59bf19914308af732378ab0f30f6f47ba2b959840121627af3da9d53b050b60d5fd6d6a94eb14f5558957e04013351bea58f2872
|
7
|
+
data.tar.gz: 93cbe3fa002925024e92131bdafbf18feae483e1587fbcedf15d72bbb2b64b0b04dacca4141d0dd393564a413db941b70036c548492b35c2d42ea5d342116fd3
|
data/README.md
CHANGED
@@ -18,28 +18,37 @@ This gem allows you to replace these commands:
|
|
18
18
|
|
19
19
|
with:
|
20
20
|
|
21
|
-
`
|
21
|
+
`ogf https://github.com/author/repo/file.rb` (if you choose to setup an alias)
|
22
22
|
|
23
23
|
#### Long version
|
24
24
|
|
25
|
-
This gem will clone the repository containing a file,
|
26
|
-
your chosen editor. If the repository already exists in the specified
|
27
|
-
any uncommitted changes will be lost (`git reset HEAD --hard` will
|
28
|
-
repository will be pulled after resetting, to get the latest
|
25
|
+
This gem will clone the repository containing a file, optionally opening that
|
26
|
+
file in your chosen editor. If the repository already exists in the specified
|
27
|
+
directory, any uncommitted changes will be lost (`git reset HEAD --hard` will
|
28
|
+
be run). The repository will be pulled after resetting, to get the latest
|
29
|
+
changes.
|
29
30
|
|
30
31
|
The editor that will be used is specified using the `EDITOR` environment
|
31
32
|
variable, which allows you to easily override your editor only for this command.
|
32
33
|
|
33
34
|
# Usage
|
34
35
|
|
35
|
-
At a minimum, you need to specify a target directory:
|
36
|
+
At a minimum, you need to specify a target directory and url:
|
36
37
|
|
37
38
|
```bash
|
38
39
|
TARGET_DIRECTORY=~/dev clone_git_file https://github.com/brandoncc/clone_git_file/blob/master/README.md
|
39
40
|
```
|
40
41
|
|
41
|
-
That will clone this repository to `~/dev/clone_git_file
|
42
|
-
|
42
|
+
That will clone this repository to `~/dev/clone_git_file`, then switch to the
|
43
|
+
`master` branch. A message will then be shown giving you that location.
|
44
|
+
|
45
|
+
There are command switches available as follows:
|
46
|
+
|
47
|
+
| Switch | Description |
|
48
|
+
| --- | --- |
|
49
|
+
| -o, <nobr>--open</nobr> | Open the file in the specified editor after cloning |
|
50
|
+
| -t, <nobr>--terminal</nobr> | Output the command which would be used to open the file in your editor, as text in the terminal. This is useful for piping into other commands. Since Ruby `system` method executions are run in a child process, this is useful for opening the file in your editor in the current shell (more details in the bonus section). This is equivalent to `-ot`. |
|
51
|
+
| -s, <nobr>--silent</nobr> | Suppress messages from the cloning process. If you want to pipe the output of `-t` into a command, you should also use this. |
|
43
52
|
|
44
53
|
If you want to override your default editor, just add `EDITOR=myeditor` to the
|
45
54
|
beginning. For example:
|
@@ -50,14 +59,21 @@ EDITOR=mvim TARGET_DIRECTORY=~/dev clone_git_file https://github.com/brandoncc/c
|
|
50
59
|
|
51
60
|
### Bonus
|
52
61
|
|
53
|
-
* You can also supply the repo url or a repo
|
54
|
-
* Setup an alias to make using the gem easy. For example, here
|
62
|
+
* You can also supply the repo url or a repo subdirectory url, and that directory will be opened by your editor.
|
63
|
+
* Setup an alias to make using the gem easy. For example, here are mine (zsh):
|
55
64
|
|
56
65
|
```bash
|
57
66
|
alias cgf="TARGET_DIRECTORY=~/dev EDITOR=mvim clone_git_file $1"
|
67
|
+
alias ogf="TARGET_DIRECTORY=~/dev EDITOR=mvim clone_git_file -ts $1"
|
58
68
|
```
|
69
|
+
|
70
|
+
`cgf` clones, then prints a message with the location of the cloned file/directory.
|
71
|
+
|
72
|
+
`ogf` prints the commands to open the file/directory in my editor. I then use `source <(...)` to pipe the printed command to `source` which runs it in my current shell. This fixes some weird things that happen when opening the editor in a child process, and also allows the current directory of my current shell to be changed (instead of the child process shell which will be lost when you close the editor).
|
73
|
+
|
74
|
+
Unfortunately `$1` doesn't get passed into the nested command, so the `source <()` usage can't be in the alias (still looking for a solution to this if anybody has one), so I used TextExpander to setup a snippet which handles that part, with the final command I run being `source <(ogf https://github.com/brandoncc/clone_git_file/blob/master/README.md)`.
|
59
75
|
|
60
76
|
# Limitations
|
61
77
|
|
62
|
-
Github is the only service that is
|
63
|
-
|
78
|
+
* Github is the only service that is currently compatible. I would like to add more services in the future.
|
79
|
+
* `-s, --silent` is only available on operating systems which can direct output to `/dev/null`, which means it is unavailable on Windows.
|
data/exe/clone_git_file
CHANGED
@@ -1,12 +1,67 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
require 'clone_git_file'
|
4
|
+
require 'optparse'
|
5
|
+
require 'rbconfig'
|
4
6
|
|
5
|
-
|
6
|
-
abort("You forgot the file!") unless file
|
7
|
-
abort("You haven't specified a target directory") unless ENV["TARGET_DIRECTORY"]
|
8
|
-
abort("No editor set, please specify the EDITOR environment variable") unless ENV["EDITOR"]
|
9
|
-
abort("Sorry, github is the only service currently compatible") unless file.match(/github\.com/)
|
7
|
+
options = {}
|
10
8
|
|
11
|
-
|
9
|
+
OptionParser.new do |opts|
|
10
|
+
opts.banner = "\nA utility for easily cloning from git services\n"
|
11
|
+
|
12
|
+
opts.on("-o", "--open", "Open in editor after cloning") do
|
13
|
+
options[:open_in_editor] = true
|
14
|
+
end
|
15
|
+
|
16
|
+
opts.on("-s", "--silent", "Suppress messages from cloning process") do
|
17
|
+
options[:silent] = true
|
18
|
+
end
|
19
|
+
|
20
|
+
opts.on("-t", "--terminal", "Output editor run command to the terminal",
|
21
|
+
"instead of executing it (same as -ot)") do
|
22
|
+
options[:output_run_command_to_terminal] = true
|
23
|
+
end
|
24
|
+
|
25
|
+
opts.on("-h", "--help", "Displays help") do
|
26
|
+
puts opts
|
27
|
+
exit
|
28
|
+
end
|
29
|
+
end.parse!
|
30
|
+
|
31
|
+
def verify_url_was_provided(url)
|
32
|
+
abort("You must specify a url to clone") unless url
|
33
|
+
end
|
34
|
+
|
35
|
+
def verify_target_directory_was_provided
|
36
|
+
abort("You haven't specified a target directory") unless ENV["TARGET_DIRECTORY"]
|
37
|
+
end
|
38
|
+
|
39
|
+
def verify_url_is_github(url)
|
40
|
+
abort("Sorry, github is the only service currently compatible") unless url.match(/github\.com/)
|
41
|
+
end
|
42
|
+
|
43
|
+
def verify_editor_is_set_when_necessary(options)
|
44
|
+
if options[:open_in_editor] || options[:output_run_command_to_terminal]
|
45
|
+
unless ENV["EDITOR"]
|
46
|
+
abort("No editor set, please specify the EDITOR environment variable")
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def verify_silent_is_available
|
52
|
+
abort("Silent mode is not available on Windows") if windows?
|
53
|
+
end
|
54
|
+
|
55
|
+
def windows?
|
56
|
+
RbConfig::CONFIG['host_os'] =~ /mswin|mingw|cygwin/
|
57
|
+
end
|
58
|
+
|
59
|
+
url = ARGV[0]
|
60
|
+
verify_url_was_provided(url)
|
61
|
+
verify_target_directory_was_provided
|
62
|
+
verify_url_is_github(url)
|
63
|
+
verify_editor_is_set_when_necessary(options)
|
64
|
+
verify_silent_is_available if options[:silent]
|
65
|
+
|
66
|
+
cloner = CloneGitFile::Cloner.new(url, options)
|
12
67
|
cloner.open_file
|
data/lib/clone_git_file.rb
CHANGED
@@ -3,8 +3,9 @@ require "clone_git_file/github_repo_parser"
|
|
3
3
|
|
4
4
|
module CloneGitFile
|
5
5
|
class Cloner
|
6
|
-
def initialize(file)
|
6
|
+
def initialize(file, options = {})
|
7
7
|
@file = file
|
8
|
+
@options = options
|
8
9
|
end
|
9
10
|
|
10
11
|
def open_file
|
@@ -14,7 +15,12 @@ module CloneGitFile
|
|
14
15
|
clone_repo
|
15
16
|
end
|
16
17
|
|
17
|
-
|
18
|
+
if @options[:open_in_editor] ||
|
19
|
+
@options[:output_run_command_to_terminal]
|
20
|
+
launch_editor
|
21
|
+
else
|
22
|
+
print_clone_location
|
23
|
+
end
|
18
24
|
end
|
19
25
|
|
20
26
|
private
|
@@ -28,7 +34,22 @@ module CloneGitFile
|
|
28
34
|
end
|
29
35
|
|
30
36
|
def launch_editor
|
31
|
-
|
37
|
+
commands = ""
|
38
|
+
file_path = "#{local_repo_path}/#{parsed_data.file_relative_path}"
|
39
|
+
|
40
|
+
# change into the directory so that relative file loads will work
|
41
|
+
commands << "cd #{File.dirname(file_path)}"
|
42
|
+
commands << "\n#{ENV["EDITOR"]} #{file_path}"
|
43
|
+
|
44
|
+
if @options[:output_run_command_to_terminal]
|
45
|
+
puts(commands)
|
46
|
+
else
|
47
|
+
system(commands)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def print_clone_location
|
52
|
+
puts "Cloned to: #{local_repo_path}/#{parsed_data.file_relative_path}"
|
32
53
|
end
|
33
54
|
|
34
55
|
def clone_repo
|
@@ -40,6 +61,8 @@ module CloneGitFile
|
|
40
61
|
commands << "\ngit checkout #{parsed_data.branch_name}"
|
41
62
|
end
|
42
63
|
|
64
|
+
commands = make_commands_silent(commands) if @options[:silent]
|
65
|
+
|
43
66
|
system(commands)
|
44
67
|
end
|
45
68
|
|
@@ -50,8 +73,15 @@ module CloneGitFile
|
|
50
73
|
commands << "\ngit reset HEAD --hard"
|
51
74
|
commands << "\ngit pull"
|
52
75
|
commands << "\ngit checkout #{parsed_data.branch_name}" if parsed_data.branch_name
|
76
|
+
commands = make_commands_silent(commands) if @options[:silent]
|
53
77
|
|
54
78
|
system(commands)
|
55
79
|
end
|
80
|
+
|
81
|
+
def make_commands_silent(commands)
|
82
|
+
cmds = commands.split("\n")
|
83
|
+
|
84
|
+
cmds.map { |c| "#{c} &> /dev/null" }.join("\n")
|
85
|
+
end
|
56
86
|
end
|
57
87
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: clone_git_file
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brandon Conway
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-12-
|
11
|
+
date: 2015-12-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|