add status

This commit is contained in:
Adam Jeniski 2026-01-05 02:37:41 -05:00
parent bfe5d7f8e4
commit 6e983f08e8

View File

@ -57,6 +57,35 @@
(catch Exception e
{:success false :repo repo-path :error (.getMessage e)})))
(defn show-status [repo-path]
"Show git status for a repository"
(let [result (process/shell {:dir (str repo-path)
:out :string
:err :string
:continue true}
"git status")]
{:repo repo-path
:status (:out result)}))
(defn status-all []
"Show git status for all modified subrepos"
(let [current-dir (fs/cwd)
subrepos (find-subrepos current-dir)
modified-repos (filter has-changes? subrepos)]
(when (empty? modified-repos)
(println "No repositories with changes found.")
(System/exit 0))
(println (format "Found %d repositories with changes:\n" (count modified-repos)))
(doseq [repo modified-repos]
(let [repo-name (fs/file-name repo)
status-result (show-status repo)]
(println (str "=== " repo-name " ==="))
(println (:status status-result))
(println)))))
(defn commitly [commit-message & {:keys [push?]}]
"Main function: commit changes across all modified subrepos"
(let [current-dir (fs/cwd)
@ -102,33 +131,45 @@
(if (empty? args)
(do
(println "Usage: commitly [-p] <commit-message>")
(println " -p Push changes after committing (or just push if no message)")
(println " commitly status")
(println "")
(println "Options:")
(println " -p Push changes after committing (or just push if no message)")
(println " status Show git status for all subrepos with changes")
(System/exit 1))
(let [push? (some #(= "-p" %) args)
message-args (remove #(= "-p" %) args)
commit-message (str/join " " message-args)]
(if (and (str/blank? commit-message) push?)
;; If -p is enabled and no message, just push without committing
(do
(println "No commit message provided with -p flag. Pushing only...")
(let [current-dir (fs/cwd)
subrepos (find-subrepos current-dir)]
(println "\nPushing changes...")
(let [push-results (map push-changes subrepos)]
(doseq [result push-results]
(if (:success result)
(println (format "✓ %s" (fs/file-name (:repo result))))
(println (format "✗ %s: %s" (fs/file-name (:repo result)) (:error result)))))
(let [failed (filter #(not (:success %)) push-results)]
(when (seq failed)
(println (format "\n%d repositories failed to push" (count failed)))
(System/exit 1))))))
;; Otherwise, require commit message
(do
(when (str/blank? commit-message)
(println "Error: commit message cannot be empty")
(System/exit 1))
(commitly commit-message :push? push?))))))
(let [first-arg (first args)]
(cond
;; Status command
(= "status" first-arg)
(status-all)
;; Commit/push command
:else
(let [push? (some #(= "-p" %) args)
message-args (remove #(= "-p" %) args)
commit-message (str/join " " message-args)]
(if (and (str/blank? commit-message) push?)
;; If -p is enabled and no message, just push without committing
(do
(println "No commit message provided with -p flag. Pushing only...")
(let [current-dir (fs/cwd)
subrepos (find-subrepos current-dir)]
(println "\nPushing changes...")
(let [push-results (map push-changes subrepos)]
(doseq [result push-results]
(if (:success result)
(println (format "✓ %s" (fs/file-name (:repo result))))
(println (format "✗ %s: %s" (fs/file-name (:repo result)) (:error result)))))
(let [failed (filter #(not (:success %)) push-results)]
(when (seq failed)
(println (format "\n%d repositories failed to push" (count failed)))
(System/exit 1))))))
;; Otherwise, require commit message
(do
(when (str/blank? commit-message)
(println "Error: commit message cannot be empty")
(System/exit 1))
(commitly commit-message :push? push?))))))))
(when (= *file* (System/getProperty "babashka.file"))
(apply -main *command-line-args*))