idossier - dossier - console collection manager Err bitreich.org 70 1Log /scm/dossier/log.gph bitreich.org 70 1Files /scm/dossier/files.gph bitreich.org 70 1Refs /scm/dossier/refs.gph bitreich.org 70 1Tags /scm/dossier/tag bitreich.org 70 1README /scm/dossier/file/README.gph bitreich.org 70 1LICENSE /scm/dossier/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 idossier (7949B) Err bitreich.org 70 i--- Err bitreich.org 70 i 1 #!/bin/sh Err bitreich.org 70 i 2 Err bitreich.org 70 i 3 REPOSITORY="${HOME}/.collections" Err bitreich.org 70 i 4 mkdir -p "$REPOSITORY" Err bitreich.org 70 i 5 test -f "${REPOSITORY}/current" && . "${REPOSITORY}/current" Err bitreich.org 70 i 6 Err bitreich.org 70 i 7 if [ -n "$CONTEXT" ] Err bitreich.org 70 i 8 then Err bitreich.org 70 i 9 REPO="${REPOSITORY}/${CONTEXT}/" Err bitreich.org 70 i 10 cd "$REPO" Err bitreich.org 70 i 11 test ! -d ".git" && git init Err bitreich.org 70 i 12 else Err bitreich.org 70 i 13 printf 'No current collection in use\n' Err bitreich.org 70 i 14 fi Err bitreich.org 70 i 15 Err bitreich.org 70 i 16 # return if an item exists Err bitreich.org 70 i 17 # $1 identifier Err bitreich.org 70 i 18 exists() { Err bitreich.org 70 i 19 cd "$REPO" Err bitreich.org 70 i 20 ls */"$1" >/dev/null 2>&1 Err bitreich.org 70 i 21 return $? Err bitreich.org 70 i 22 } Err bitreich.org 70 i 23 Err bitreich.org 70 i 24 # displays the values of an identifier Err bitreich.org 70 i 25 # $1 identifier Err bitreich.org 70 i 26 show() { Err bitreich.org 70 i 27 cd "$REPO" Err bitreich.org 70 i 28 if exists "$1" Err bitreich.org 70 i 29 then Err bitreich.org 70 i 30 SEEN=0 Err bitreich.org 70 i 31 for attribute in * Err bitreich.org 70 i 32 do Err bitreich.org 70 i 33 if [ -f "${attribute}/${1}" ] Err bitreich.org 70 i 34 then Err bitreich.org 70 i 35 if [ "$SEEN" -eq 0 ] Err bitreich.org 70 i 36 then Err bitreich.org 70 i 37 printf "%s:\n" "$1" Err bitreich.org 70 i 38 SEEN=1 Err bitreich.org 70 i 39 fi Err bitreich.org 70 i 40 printf "%15s: %s\n" "$attribute" "$(cat "${attribute}/${1}")" Err bitreich.org 70 i 41 fi Err bitreich.org 70 i 42 done Err bitreich.org 70 i 43 exit 0 Err bitreich.org 70 i 44 else Err bitreich.org 70 i 45 printf '%s is not in the library.\n' "$1" Err bitreich.org 70 i 46 exit 1 Err bitreich.org 70 i 47 fi Err bitreich.org 70 i 48 } Err bitreich.org 70 i 49 Err bitreich.org 70 i 50 # displays the list of values per attributes Err bitreich.org 70 i 51 show_attributes_values() { Err bitreich.org 70 i 52 cd "$REPO" Err bitreich.org 70 i 53 for attribute in * Err bitreich.org 70 i 54 do Err bitreich.org 70 i 55 printf "%s:\n" "$attribute" Err bitreich.org 70 i 56 awk '{ print }' "${attribute}"/* | sort | uniq | sed 's/^/ /' Err bitreich.org 70 i 57 done Err bitreich.org 70 i 58 exit 0 Err bitreich.org 70 i 59 } Err bitreich.org 70 i 60 Err bitreich.org 70 i 61 # import data from a csv Err bitreich.org 70 i 62 # $1 is the file to import Err bitreich.org 70 i 63 import_csv() { Err bitreich.org 70 i 64 git tag "Importing CSV" Err bitreich.org 70 i 65 awk -F "," '{ Err bitreich.org 70 i 66 if(NR==1) { Err bitreich.org 70 i 67 for(i=1;i<=NF;i=i+1) { Err bitreich.org 70 i 68 headers[i] = $i Err bitreich.org 70 i 69 } Err bitreich.org 70 i 70 } else { Err bitreich.org 70 i 71 out = $1; Err bitreich.org 70 i 72 for(i=2;i<=NF;i=i+1) { Err bitreich.org 70 i 73 if(! match($i,/^""$/) && $i !="") { Err bitreich.org 70 i 74 out = out " "headers[i]" "$i; Err bitreich.org 70 i 75 } Err bitreich.org 70 i 76 } Err bitreich.org 70 i 77 if(out==$1) { Err bitreich.org 70 i 78 print "empty" Err bitreich.org 70 i 79 } else { Err bitreich.org 70 i 80 out=out "\n" Err bitreich.org 70 i 81 print out Err bitreich.org 70 i 82 system("dossier "out) Err bitreich.org 70 i 83 } Err bitreich.org 70 i 84 } Err bitreich.org 70 i 85 }' "$1" Err bitreich.org 70 i 86 } Err bitreich.org 70 i 87 Err bitreich.org 70 i 88 # export the data in csv format "data","data","data" Err bitreich.org 70 i 89 # we assume it'll works with the dataset Err bitreich.org 70 i 90 export_csv() { Err bitreich.org 70 i 91 cd "$REPO" Err bitreich.org 70 i 92 Err bitreich.org 70 i 93 # display header Err bitreich.org 70 i 94 printf '"identifier"' Err bitreich.org 70 i 95 find . -name '.git' -prune -o -type f -print | cut -d '/' -f 2 | sort | uniq | while read attr Err bitreich.org 70 i 96 do Err bitreich.org 70 i 97 printf ',"%s"' $attr Err bitreich.org 70 i 98 done Err bitreich.org 70 i 99 printf '\n' Err bitreich.org 70 i 100 Err bitreich.org 70 i 101 # print database Err bitreich.org 70 i 102 find . -name '.git' -prune -o -type f -print | cut -d '/' -f 3 | sort | uniq | while read id Err bitreich.org 70 i 103 do Err bitreich.org 70 i 104 printf '"%s",' "$id" Err bitreich.org 70 i 105 FIRST=0 Err bitreich.org 70 i 106 find . -name '.git' -prune -o -type f -print | cut -d '/' -f 2 | sort | uniq | while read attr Err bitreich.org 70 i 107 do Err bitreich.org 70 i 108 if [ "$FIRST" -eq 0 ] Err bitreich.org 70 i 109 then Err bitreich.org 70 i 110 FIRST=1 Err bitreich.org 70 i 111 else Err bitreich.org 70 i 112 printf "," Err bitreich.org 70 i 113 fi Err bitreich.org 70 i 114 # for faster processing, we do not check existence of file before Err bitreich.org 70 i 115 awk '{ printf "\"%s\"",$0}' "${attr}/${id}" 2>/dev/null \ Err bitreich.org 70 i 116 || printf '""' Err bitreich.org 70 i 117 done Err bitreich.org 70 i 118 printf '\n' Err bitreich.org 70 i 119 done Err bitreich.org 70 i 120 IFS=$OLDIFS Err bitreich.org 70 i 121 exit 0 Err bitreich.org 70 i 122 } Err bitreich.org 70 i 123 Err bitreich.org 70 i 124 # delete identifier from attributes Err bitreich.org 70 i 125 # $1 identifier Err bitreich.org 70 i 126 delete() { Err bitreich.org 70 i 127 cd "$REPO" Err bitreich.org 70 i 128 SEEN=0 Err bitreich.org 70 i 129 for attribute in * Err bitreich.org 70 i 130 do Err bitreich.org 70 i 131 if [ -f "${attribute}/${1}" ] Err bitreich.org 70 i 132 then Err bitreich.org 70 i 133 git rm "${attribute}/${1}" Err bitreich.org 70 i 134 git commit -m "Delete ${attribute} ${1}" "${attribute}/${1}" Err bitreich.org 70 i 135 rmdir "$attribute" 2> /dev/null Err bitreich.org 70 i 136 SEEN=1 Err bitreich.org 70 i 137 fi Err bitreich.org 70 i 138 done Err bitreich.org 70 i 139 Err bitreich.org 70 i 140 # did we find it? Err bitreich.org 70 i 141 if [ "$SEEN" -eq 0 ] Err bitreich.org 70 i 142 then Err bitreich.org 70 i 143 printf "%s is not in the library!\n" "$1" Err bitreich.org 70 i 144 exit 1 Err bitreich.org 70 i 145 else Err bitreich.org 70 i 146 exit 0 Err bitreich.org 70 i 147 fi Err bitreich.org 70 i 148 } Err bitreich.org 70 i 149 Err bitreich.org 70 i 150 # displays list of identifiers Err bitreich.org 70 i 151 show_list() { Err bitreich.org 70 i 152 cd "$REPO" Err bitreich.org 70 i 153 find . -name '.git' -prune -o -type f -print | cut -d '/' -f 3 | sort | uniq -c | \ Err bitreich.org 70 i 154 awk '{ for(i=2;i<=NF;i=i+1) { printf "%s ", $i } Err bitreich.org 70 i 155 printf "(%i)\n", $1 Err bitreich.org 70 i 156 }' Err bitreich.org 70 i 157 exit 0 Err bitreich.org 70 i 158 } Err bitreich.org 70 i 159 Err bitreich.org 70 i 160 # displays attributes used Err bitreich.org 70 i 161 show_attributes() { Err bitreich.org 70 i 162 cd "$REPO" Err bitreich.org 70 i 163 find . -name '.git' -prune -o -type f -print | cut -d '/' -f 2 | sort | uniq -c | \ Err bitreich.org 70 i 164 awk '{ for(i=2;i<=NF;i=i+1) { printf "%s ", $i } Err bitreich.org 70 i 165 printf "(%i)\n", $1 Err bitreich.org 70 i 166 }' Err bitreich.org 70 i 167 exit 0 Err bitreich.org 70 i 168 } Err bitreich.org 70 i 169 Err bitreich.org 70 i 170 # add/modify a value Err bitreich.org 70 i 171 # $@ identifier / attr / value / attr / value / .... Err bitreich.org 70 i 172 # shift to have attr / value again and again Err bitreich.org 70 i 173 add_value() { Err bitreich.org 70 i 174 cd "$REPO" Err bitreich.org 70 i 175 ID="$1" Err bitreich.org 70 i 176 shift Err bitreich.org 70 i 177 Err bitreich.org 70 i 178 while [ "$#" -gt 1 ] Err bitreich.org 70 i 179 do Err bitreich.org 70 i 180 ATTRIBUTE="$1" Err bitreich.org 70 i 181 VALUE="$2" Err bitreich.org 70 i 182 shift 2 Err bitreich.org 70 i 183 Err bitreich.org 70 i 184 mkdir -p "$ATTRIBUTE" Err bitreich.org 70 i 185 printf '%s' "$VALUE" > "${ATTRIBUTE}/${ID}" Err bitreich.org 70 i 186 git add "${ATTRIBUTE}/${ID}" Err bitreich.org 70 i 187 git commit -m "Modify ${ATTRIBUTE} on ${ID}" "${ATTRIBUTE}/${ID}" Err bitreich.org 70 i 188 done Err bitreich.org 70 i 189 exit 0 Err bitreich.org 70 i 190 } Err bitreich.org 70 i 191 Err bitreich.org 70 i 192 # returns identifiers having attribute=value Err bitreich.org 70 i 193 # $1 attribute Err bitreich.org 70 i 194 # $2 value Err bitreich.org 70 i 195 search_value() { Err bitreich.org 70 i 196 cd "$REPO" Err bitreich.org 70 i 197 shift Err bitreich.org 70 i 198 Err bitreich.org 70 i 199 RESULT=$(mktemp /tmp/dossier.XXXXXXXXXXXX) Err bitreich.org 70 i 200 COUNT=0 Err bitreich.org 70 i 201 if [ -f "$RESULT" ] Err bitreich.org 70 i 202 then Err bitreich.org 70 i 203 while [ "$#" -gt 1 ] Err bitreich.org 70 i 204 do Err bitreich.org 70 i 205 ATTRIBUTE="$1" Err bitreich.org 70 i 206 NEGATE="" Err bitreich.org 70 i 207 if [ "${ATTRIBUTE#!}" -ne "${ATTRIBUTE}" ] Err bitreich.org 70 i 208 then Err bitreich.org 70 i 209 ATTRIBUTE="${ATTRIBUTE#!}" Err bitreich.org 70 i 210 NEGATE=v Err bitreich.org 70 i 211 fi Err bitreich.org 70 i 212 VALUE="$2" Err bitreich.org 70 i 213 shift 2 Err bitreich.org 70 i 214 if [ ! -d "$ATTRIBUTE" ] Err bitreich.org 70 i 215 then Err bitreich.org 70 i 216 printf 'The attribute %s do not exists\n' "$ATTRIBUTE" Err bitreich.org 70 i 217 exit 5 Err bitreich.org 70 i 218 fi Err bitreich.org 70 i 219 grep "-rl${NEGATE}" "$VALUE" "$ATTRIBUTE" | cut -d '/' -f 2 >> "$RESULT" Err bitreich.org 70 i 220 COUNT=$(( COUNT + 1 )) Err bitreich.org 70 i 221 done Err bitreich.org 70 i 222 sort "$RESULT" | uniq -c | \ Err bitreich.org 70 i 223 awk -v count=$COUNT \ Err bitreich.org 70 i 224 '{ if($1==count) { Err bitreich.org 70 i 225 $1="" # remove uniq result Err bitreich.org 70 i 226 gsub(/^[ ]+/,"",$0) # remove leading space due to uniq Err bitreich.org 70 i 227 print Err bitreich.org 70 i 228 }}' Err bitreich.org 70 i 229 else Err bitreich.org 70 i 230 printf 'Cannot create a temporary file in /tmp\n' Err bitreich.org 70 i 231 exit 6 Err bitreich.org 70 i 232 fi Err bitreich.org 70 i 233 Err bitreich.org 70 i 234 exit 0 Err bitreich.org 70 i 235 } Err bitreich.org 70 i 236 Err bitreich.org 70 i 237 # returns list of identifiers in a attribute Err bitreich.org 70 i 238 # $1 attribute Err bitreich.org 70 i 239 list() { Err bitreich.org 70 i 240 cd "$REPO" Err bitreich.org 70 i 241 grep -r . "$1" | cut -d '/' -f 2- | sort Err bitreich.org 70 i 242 exit 0 Err bitreich.org 70 i 243 } Err bitreich.org 70 i 244 Err bitreich.org 70 i 245 # displays usage Err bitreich.org 70 i 246 usage() { Err bitreich.org 70 i 247 printf '%s\n' \ Err bitreich.org 70 i 248 "Get help" \ Err bitreich.org 70 i 249 ": dossier help" \ Err bitreich.org 70 i 250 "" \ Err bitreich.org 70 i 251 "Export data as CSV" \ Err bitreich.org 70 i 252 ": dossier export" \ Err bitreich.org 70 i 253 "" \ Err bitreich.org 70 i 254 "Import data from CSV" \ Err bitreich.org 70 i 255 ": dossier import file.csv" \ Err bitreich.org 70 i 256 "" \ Err bitreich.org 70 i 257 "Show collections, register collections, switch current collection" \ Err bitreich.org 70 i 258 ": dossier collections [register path name] [name]" \ Err bitreich.org 70 i 259 "" \ Err bitreich.org 70 i 260 "Show items and display informations about an item" \ Err bitreich.org 70 i 261 ": dossier show [attributes] [identifier]" \ Err bitreich.org 70 i 262 "" \ Err bitreich.org 70 i 263 "Look at attributes, search items having some values" \ Err bitreich.org 70 i 264 ": dossier search [attribute [value]] ... [attribute [value]] ..." \ Err bitreich.org 70 i 265 "" \ Err bitreich.org 70 i 266 "Add / Modify attributes values on an item" \ Err bitreich.org 70 i 267 ": dossier identifier attribute value ... attribute value ..." Err bitreich.org 70 i 268 exit 0 Err bitreich.org 70 i 269 } Err bitreich.org 70 i 270 Err bitreich.org 70 i 271 switch() { Err bitreich.org 70 i 272 if [ ! -L "${REPOSITORY}/${1}" ] Err bitreich.org 70 i 273 then Err bitreich.org 70 i 274 printf 'Collection %s is not registered\n' "$1" Err bitreich.org 70 i 275 exit 9 Err bitreich.org 70 i 276 else Err bitreich.org 70 i 277 printf 'Switching to collection %s\n' "$1" Err bitreich.org 70 i 278 printf 'CONTEXT=%s\n' $1 > "${REPOSITORY}/current" Err bitreich.org 70 i 279 exit $? Err bitreich.org 70 i 280 fi Err bitreich.org 70 i 281 } Err bitreich.org 70 i 282 Err bitreich.org 70 i 283 collections() { Err bitreich.org 70 i 284 ls "$REPOSITORY" | grep -v 'current' | sed "s/^${CONTEXT}$/& */" Err bitreich.org 70 i 285 exit 0 Err bitreich.org 70 i 286 } Err bitreich.org 70 i 287 Err bitreich.org 70 i 288 # create symlink to register a collection Err bitreich.org 70 i 289 # $1 absolute path to collection Err bitreich.org 70 i 290 # $2 name of collection Err bitreich.org 70 i 291 register() { Err bitreich.org 70 i 292 if [ -d "$1" ] Err bitreich.org 70 i 293 then Err bitreich.org 70 i 294 if ! expr "$1" : '^/' >/dev/null Err bitreich.org 70 i 295 then Err bitreich.org 70 i 296 printf 'Aborting, the path of the collection must be an absolute path. %s is not valid\n' "$1" Err bitreich.org 70 i 297 fi Err bitreich.org 70 i 298 test -L "${REPOSITORY}/${2}" && rm "${REPOSITORY}/${2}" Err bitreich.org 70 i 299 ln -s "$1" "${REPOSITORY}/${2}" Err bitreich.org 70 i 300 printf "%s registered. Use it as default with\n\t%s collections %s\n" "$2" "$0" "$2" Err bitreich.org 70 i 301 exit 0 Err bitreich.org 70 i 302 else Err bitreich.org 70 i 303 printf 'Aborting, %s is not a directory\n' "$2" Err bitreich.org 70 i 304 exit 8 Err bitreich.org 70 i 305 fi Err bitreich.org 70 i 306 } Err bitreich.org 70 i 307 Err bitreich.org 70 i 308 Err bitreich.org 70 i 309 # commands not requiring a repository set Err bitreich.org 70 i 310 if [ "$1" = "help" ] ; then usage ; fi Err bitreich.org 70 i 311 Err bitreich.org 70 i 312 if [ "$1" = "collections" ]; then Err bitreich.org 70 i 313 if [ "$#" -eq 1 ]; then collections ; fi Err bitreich.org 70 i 314 if [ "$#" -eq 2 ]; then switch "$2" ; fi Err bitreich.org 70 i 315 if [ "$2" = "register" ] && [ "$#" -eq 4 ]; then register "$3" "$4" ; fi Err bitreich.org 70 i 316 fi Err bitreich.org 70 i 317 Err bitreich.org 70 i 318 # quit if CONTEXT is not set Err bitreich.org 70 i 319 test -n "$CONTEXT" || exit 10 Err bitreich.org 70 i 320 Err bitreich.org 70 i 321 Err bitreich.org 70 i 322 if [ "$1" = "import" ] && [ -f "${OLDPWD}/${2}" ]; then import_csv "${OLDPWD}/${2}" ; fi Err bitreich.org 70 i 323 if [ "$1" = "export" ] ; then export_csv ; fi Err bitreich.org 70 i 324 if [ "$1" = "rm" ] && [ "$#" -eq 2 ] ; then delete "$2" ; fi Err bitreich.org 70 i 325 Err bitreich.org 70 i 326 # dealing with identifiers Err bitreich.org 70 i 327 if [ "$1" = "show" ] Err bitreich.org 70 i 328 then Err bitreich.org 70 i 329 if [ "$#" -eq 1 ]; then show_list ; fi Err bitreich.org 70 i 330 if [ "$#" -eq 2 ]; then Err bitreich.org 70 i 331 if [ "$2" = "attributes" ] Err bitreich.org 70 i 332 then Err bitreich.org 70 i 333 show_attributes_values Err bitreich.org 70 i 334 else Err bitreich.org 70 i 335 show "$2" Err bitreich.org 70 i 336 fi Err bitreich.org 70 i 337 fi Err bitreich.org 70 i 338 fi Err bitreich.org 70 i 339 Err bitreich.org 70 i 340 # dealing with attributes Err bitreich.org 70 i 341 if [ "$1" = "search" ]; Err bitreich.org 70 i 342 then Err bitreich.org 70 i 343 if [ "$#" -eq 1 ]; then show_attributes ; fi Err bitreich.org 70 i 344 if [ "$#" -eq 2 ]; then list "$2" ; fi Err bitreich.org 70 i 345 if [ "$#" -ge 3 ]; then search_value "$@" ; fi Err bitreich.org 70 i 346 fi Err bitreich.org 70 i 347 Err bitreich.org 70 i 348 if [ "$#" -ge 3 ]; then add_value "$@" ; fi Err bitreich.org 70 i 349 Err bitreich.org 70 i 350 # no command, maybe it's an item, try it Err bitreich.org 70 i 351 if [ "$#" -eq 1 ] && exists "$1" ; then show "$1" ; fi Err bitreich.org 70 i 352 Err bitreich.org 70 i 353 usage Err bitreich.org 70 .