Codereview Spacewander - whitespaces in workspace locations

This commit is contained in:
Niklas Schlimm 2017-03-29 17:34:39 +02:00
parent 7263b6c611
commit ca62bdcfe6
5 changed files with 343 additions and 22 deletions

View file

@ -237,7 +237,7 @@ $ git effort bin/* lib/*
## git bulk
`git bulk` adds covenient support for operations that you want to execute on multiple git repositories.
`git bulk` adds convenient support for operations that you want to execute on multiple git repositories.
* simply register workspaces that contain multiple git repos in their directory structure
* run any git command on the repositories of the registered workspaces in one command to `git bulk`

View file

@ -1,6 +1,6 @@
#!/usr/bin/env bash
invers=`tput rev`
reset=`tput sgr0`
invers=$(tput rev)
reset=$(tput sgr0)
txtbld=$(tput bold)
bldred=${txtbld}$(tput setaf 1)
@ -22,13 +22,13 @@ usage() {
}
# add another workspace to global git config
function addworkspace { git config --global bulkworkspaces.$wsname "$wsdir"; }
function addworkspace { git config --global bulkworkspaces."$wsname" "$wsdir"; }
# add current directory
function addcurrent { git config --global bulkworkspaces.$wsname "$PWD"; }
function addcurrent { git config --global bulkworkspaces."$wsname" "$PWD"; }
# remove workspace from global git config
function removeworkspace { checkWSName && git config --global --unset bulkworkspaces.$wsname; }
function removeworkspace { checkWSName && git config --global --unset bulkworkspaces."$wsname"; }
# remove workspace from global git config
function purge { git config --global --remove-section bulkworkspaces; }
@ -68,20 +68,26 @@ function checkGitCommand () {
# check if workspace name is registered
function checkWSName () {
while read workspace; do
rwsname=$(echo $workspace | cut -f1 -d' ' | cut -f2 -d'.')
if [[ $rwsname == $wsname ]]; then return; fi
parseWsName "$workspace"
if [[ $rwsname == "$wsname" ]]; then return; fi
done <<< "$(echo "$(listall)")"
# when here the ws name was not found
usage && echo "error: unknown workspace name: $wsname" && exit 1
}
# parse out wsname from workspacespec
function parseWsName () {
local wsspec="$1"
rwsdir=${wsspec#* }
rwsname=${wsspec#*.} && rwsname=${rwsname%% *}
}
# detects the wsname of the current directory
function wsnameToCurrent () {
while read workspace; do
if [ -z "$workspace" ]; then continue; fi
rwsdir=${workspace#* }
rwsname=${workspace#*.} && rwsname=${rwsname% *}
if echo $PWD | grep -o -q $rwsdir; then wsname=$rwsname && return; fi
parseWsName "$workspace"
if echo "$PWD" | grep -o -q "$rwsdir"; then wsname="$rwsname" && return; fi
done <<< "$(echo "$(listall)")"
# when here then not in workspace dir
echo "error: you are not in a workspace directory. your registered workspaces are:" && \
@ -90,7 +96,7 @@ function wsnameToCurrent () {
# helper to check number of arguments
function allowedargcount () {
( test $paramcount -ne $1 ) && ( usage && echo 1>&2 "error: wrong number of arguments" && exit 1 )
( test "$paramcount" -ne "$1" ) && ( usage && echo 1>&2 "error: wrong number of arguments" && exit 1 )
}
# execute the bulk operation
@ -98,19 +104,18 @@ function executBulkOp () {
checkGitCommand
if ! $allwsmode && ! $singlemode; then wsnameToCurrent; fi # by default git bulk works within the 'current' workspace
listall | while read workspacespec; do
cwsname=$(echo $workspacespec | cut -f1 -d' ' | cut -f2 -d'.')
if [[ -n $wsname ]] && [[ $cwsname != $wsname ]]; then continue; fi
wslocation=$(echo $workspacespec | cut -f2 -d' ')
eval cd "$wslocation"
actual=$(pwd)
parseWsName "$workspacespec"
if [[ -n $wsname ]] && [[ $rwsname != "$wsname" ]]; then continue; fi
eval cd "\"$rwsdir\""
local actual=$(pwd)
echo "Executing bulk operation in workspace ${invers}$actual${reset}"
eval find . -name ".git" | while read line; do
gitrepodir=${line::${#line}-5} # cut the .git part of find results to have the root git directory of that repository
eval cd "$gitrepodir" # into git repo location
curdir=$(pwd)
local gitrepodir=${line::${#line}-5} # cut the .git part of find results to have the root git directory of that repository
eval cd "\"$gitrepodir\"" # into git repo location
local curdir=$(pwd)
echo "Current repository: ${actual#${curdir%/*}}/${bldred}${curdir##*/}${reset}"
guardedExecution
eval cd "$wslocation" # back to origin location of last find command
eval cd "\"$rwsdir\"" # back to origin location of last find command
done
done
}

View file

@ -0,0 +1,125 @@
.\" generated with Ronn/v0.7.3
.\" http://github.com/rtomayko/ronn/tree/0.7.3
.
.TH "GIT\-BULK" "1" "March 2017" "" "Git Extras"
.
.SH "NAME"
\fBgit\-bulk\fR \- Run git commands on multiple repositories
.
.SH "SYNOPSIS"
usage: usage: git bulk [\-g] ([\-a]|[\-w <ws\-name>]) <git command> git bulk \-\-addworkspace <ws\-name> <ws\-root\-directory> git bulk \-\-removeworkspace <ws\-name> git bulk \-\-addcurrent <ws\-name> git bulk \-\-purge git bulk \-\-listall
.
.SH "DESCRIPTION"
git bulk adds convenien support for operations that you want to execute on multiple git repositories\.
.
.IP "\(bu" 4
simply register workspaces that contain multiple git repos in their directory structure
.
.IP "\(bu" 4
run any git command on the repositories of the registered workspaces in one command to \fBgit bulk\fR
.
.IP "\(bu" 4
use the "guarded mode" to check on each execution
.
.IP "" 0
.
.SH "OPTIONS"
\-a
.
.P
Run a git command on all workspaces and their repositories\.
.
.P
\-g
.
.P
Ask the user for confirmation on every execution\.
.
.P
\-w <ws\-name>
.
.P
Run the git command on the specified workspace\. The workspace must be registered\.
.
.P
<git command>
.
.P
Any git Command you wish to execute on the repositories\.
.
.P
\-\-addworkspace <ws\-name> <ws\-root\-directory>
.
.P
Register a workspace for bulk operations\. All repositories in the diretories below <ws\-root\-directory> get registered under this workspace with the name <ws\-name>\.
.
.P
\-\-removeworkspace <ws\-name>
.
.P
Remove the workspace with the logical name <ws\-name>\.
.
.P
\-\-addcurrent <ws\-name>
.
.P
Adds the current directory as workspace to git bulk operations\. The workspace is referenced with its logical name <ws\-name>\.
.
.P
git bulk \-\-purge
.
.P
Removes all defined repository locations\.
.
.P
git bulk \-\-listall
.
.P
List all registered repositories\.
.
.SH "EXAMPLES"
.
.nf
Register a workspace so that git bulk knows about it:
$ git bulk \-\-addworkspace personal ~/workspaces/personal
Register the current directory as a workspace to git bulk:
$ git bulk \-\-addcurrent personal
List all registered workspaces:
$ git bulk \-\-listall
Run a git command on the repositories of the current workspace:
$ git bulk fetch
Run a git command on the specified workspace and its repositories:
$ git bulk \-w personal fetch
Run a git command but ask user for confirmation on every execution (guarded mode):
$ git bulk \-g fetch
Remove a registered workspace:
$ git bulk \-\-removeworkspace personal
Remove all registered workspaces:
$ git bulk \-\-purge
.
.fi
.
.SH "AUTHOR"
Written by Niklas Schlimm <\fIns103@hotmail\.de\fR>
.
.SH "REPORTING BUGS"
<https://github\.com/nschlimm/git\-bulk>
.
.SH "SEE ALSO"
<\fIhttps://github\.com/tj/git\-extras\fR>

View file

@ -0,0 +1,191 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv='content-type' value='text/html;charset=utf8'>
<meta name='generator' value='Ronn/v0.7.3 (http://github.com/rtomayko/ronn/tree/0.7.3)'>
<title>git-bulk(1) - Run git commands on multiple repositories</title>
<style type='text/css' media='all'>
/* style: man */
body#manpage {margin:0}
.mp {max-width:100ex;padding:0 9ex 1ex 4ex}
.mp p,.mp pre,.mp ul,.mp ol,.mp dl {margin:0 0 20px 0}
.mp h2 {margin:10px 0 0 0}
.mp > p,.mp > pre,.mp > ul,.mp > ol,.mp > dl {margin-left:8ex}
.mp h3 {margin:0 0 0 4ex}
.mp dt {margin:0;clear:left}
.mp dt.flush {float:left;width:8ex}
.mp dd {margin:0 0 0 9ex}
.mp h1,.mp h2,.mp h3,.mp h4 {clear:left}
.mp pre {margin-bottom:20px}
.mp pre+h2,.mp pre+h3 {margin-top:22px}
.mp h2+pre,.mp h3+pre {margin-top:5px}
.mp img {display:block;margin:auto}
.mp h1.man-title {display:none}
.mp,.mp code,.mp pre,.mp tt,.mp kbd,.mp samp,.mp h3,.mp h4 {font-family:monospace;font-size:14px;line-height:1.42857142857143}
.mp h2 {font-size:16px;line-height:1.25}
.mp h1 {font-size:20px;line-height:2}
.mp {text-align:justify;background:#fff}
.mp,.mp code,.mp pre,.mp pre code,.mp tt,.mp kbd,.mp samp {color:#131211}
.mp h1,.mp h2,.mp h3,.mp h4 {color:#030201}
.mp u {text-decoration:underline}
.mp code,.mp strong,.mp b {font-weight:bold;color:#131211}
.mp em,.mp var {font-style:italic;color:#232221;text-decoration:none}
.mp a,.mp a:link,.mp a:hover,.mp a code,.mp a pre,.mp a tt,.mp a kbd,.mp a samp {color:#0000ff}
.mp b.man-ref {font-weight:normal;color:#434241}
.mp pre {padding:0 4ex}
.mp pre code {font-weight:normal;color:#434241}
.mp h2+pre,h3+pre {padding-left:0}
ol.man-decor,ol.man-decor li {margin:3px 0 10px 0;padding:0;float:left;width:33%;list-style-type:none;text-transform:uppercase;color:#999;letter-spacing:1px}
ol.man-decor {width:100%}
ol.man-decor li.tl {text-align:left}
ol.man-decor li.tc {text-align:center;letter-spacing:4px}
ol.man-decor li.tr {text-align:right;float:right}
</style>
</head>
<!--
The following styles are deprecated and will be removed at some point:
div#man, div#man ol.man, div#man ol.head, div#man ol.man.
The .man-page, .man-decor, .man-head, .man-foot, .man-title, and
.man-navigation should be used instead.
-->
<body id='manpage'>
<div class='mp' id='man'>
<div class='man-navigation' style='display:none'>
<a href="#NAME">NAME</a>
<a href="#SYNOPSIS">SYNOPSIS</a>
<a href="#DESCRIPTION">DESCRIPTION</a>
<a href="#OPTIONS">OPTIONS</a>
<a href="#EXAMPLES">EXAMPLES</a>
<a href="#AUTHOR">AUTHOR</a>
<a href="#REPORTING-BUGS">REPORTING BUGS</a>
<a href="#SEE-ALSO">SEE ALSO</a>
</div>
<ol class='man-decor man-head man head'>
<li class='tl'>git-bulk(1)</li>
<li class='tc'>Git Extras</li>
<li class='tr'>git-bulk(1)</li>
</ol>
<h2 id="NAME">NAME</h2>
<p class="man-name">
<code>git-bulk</code> - <span class="man-whatis">Run git commands on multiple repositories</span>
</p>
<h2 id="SYNOPSIS">SYNOPSIS</h2>
<p>usage: usage: git bulk [-g] ([-a]|[-w &lt;ws-name&gt;]) &lt;git command&gt;
git bulk --addworkspace &lt;ws-name&gt; &lt;ws-root-directory&gt;
git bulk --removeworkspace &lt;ws-name&gt;
git bulk --addcurrent &lt;ws-name&gt;
git bulk --purge
git bulk --listall</p>
<h2 id="DESCRIPTION">DESCRIPTION</h2>
<p>git bulk adds convenien support for operations that you want to execute on multiple git repositories.</p>
<ul>
<li>simply register workspaces that contain multiple git repos in their directory structure</li>
<li>run any git command on the repositories of the registered workspaces in one command to <code>git bulk</code></li>
<li>use the "guarded mode" to check on each execution</li>
</ul>
<h2 id="OPTIONS">OPTIONS</h2>
<p> -a</p>
<p> Run a git command on all workspaces and their repositories.</p>
<p> -g</p>
<p> Ask the user for confirmation on every execution.</p>
<p> -w &lt;ws-name&gt;</p>
<p> Run the git command on the specified workspace. The workspace must be registered.</p>
<p> &lt;git command&gt;</p>
<p> Any git Command you wish to execute on the repositories.</p>
<p> --addworkspace &lt;ws-name&gt; &lt;ws-root-directory&gt;</p>
<p> Register a workspace for bulk operations. All repositories in the diretories below &lt;ws-root-directory&gt; get registered under this workspace with the name &lt;ws-name&gt;.</p>
<p> --removeworkspace &lt;ws-name&gt;</p>
<p> Remove the workspace with the logical name &lt;ws-name&gt;.</p>
<p> --addcurrent &lt;ws-name&gt;</p>
<p> Adds the current directory as workspace to git bulk operations. The workspace is referenced with its logical name &lt;ws-name&gt;.</p>
<p> git bulk --purge</p>
<p> Removes all defined repository locations.</p>
<p> git bulk --listall</p>
<p> List all registered repositories.</p>
<h2 id="EXAMPLES">EXAMPLES</h2>
<pre><code>Register a workspace so that git bulk knows about it:
$ git bulk --addworkspace personal ~/workspaces/personal
Register the current directory as a workspace to git bulk:
$ git bulk --addcurrent personal
List all registered workspaces:
$ git bulk --listall
Run a git command on the repositories of the current workspace:
$ git bulk fetch
Run a git command on the specified workspace and its repositories:
$ git bulk -w personal fetch
Run a git command but ask user for confirmation on every execution (guarded mode):
$ git bulk -g fetch
Remove a registered workspace:
$ git bulk --removeworkspace personal
Remove all registered workspaces:
$ git bulk --purge
</code></pre>
<h2 id="AUTHOR">AUTHOR</h2>
<p>Written by Niklas Schlimm &lt;<a href="&#109;&#97;&#105;&#x6c;&#116;&#111;&#58;&#x6e;&#x73;&#49;&#48;&#x33;&#64;&#x68;&#x6f;&#x74;&#109;&#97;&#105;&#108;&#x2e;&#x64;&#x65;" data-bare-link="true">&#x6e;&#x73;&#x31;&#x30;&#x33;&#x40;&#x68;&#x6f;&#116;&#x6d;&#x61;&#x69;&#x6c;&#x2e;&#x64;&#101;</a>&gt;</p>
<h2 id="REPORTING-BUGS">REPORTING BUGS</h2>
<p>&lt;https://github.com/nschlimm/git-bulk&gt;</p>
<h2 id="SEE-ALSO">SEE ALSO</h2>
<p>&lt;<a href="https://github.com/tj/git-extras" data-bare-link="true">https://github.com/tj/git-extras</a>&gt;</p>
<ol class='man-decor man-foot man foot'>
<li class='tl'></li>
<li class='tc'>March 2017</li>
<li class='tr'>git-bulk(1)</li>
</ol>
</div>
</body>
</html>

View file

@ -12,7 +12,7 @@ usage: usage: git bulk [-g] ([-a]|[-w &lt;ws-name&gt;]) &lt;git command&gt;
## DESCRIPTION
git bulk adds covenien support for operations that you want to execute on multiple git repositories.
git bulk adds convenien support for operations that you want to execute on multiple git repositories.
- simply register workspaces that contain multiple git repos in their directory structure
- run any git command on the repositories of the registered workspaces in one command to `git bulk`