A rewrite of the popular project GitUp that works in Linux, Mac, and Windows.

Related tags

App git-down
Overview

GitDown

This is a rewrite from the ground up of the popular GitUp library available on Mac. It is built using Kotlin and Compose Desktop from Jetbrains.

The big benefit of this project is that it is multiplatform. I'm actually doing all development on a Linux machine, but in this should work on Windows and Mac as well.

I wouldn't recommend trying to use this for any real world projects until I have a stable release published.

I'm also using the application itself as my primary Git companion along the way so that all the irksome bugs will gnaw away at me until I fix them, not to mention complete lack of features at this point.

As you can see this is still in early development and only a few bits and bops here and there are functional

your-pic-caption-name

Things that are working so far ( so you don't waste much time debating on whether you should use this atm )

Commit View

  • Working Directory shows modified files
  • Working Directory shows deleted files
  • Working directory shows added files
  • index shows modified files
  • index shows deleted files
  • index shows added files
  • index shows renamed files
  • commit functionality for staged items
  • amend head functionality
  • stage all functionality
  • unstage all functionality
  • diff viewer ( in general )
  • multi file diff
  • stage diff lines
  • unstage diff lines
  • view in diff tool
  • view in file browser
  • open file
  • stage file
  • unstage file
  • discard line changes
  • working directory empty state
  • index empty state
  • commit area guidelines

Stash View

Sort this out once commit view is semi usable

Map View

Sort this out when stash view is semi usable

Comments
  • add a section about needed stuff and how to build & run it

    add a section about needed stuff and how to build & run it

    Hey, I want to try git-down out and got into trouble at starting it. I've never had anything to do with kotlin or gradle. My attempts were simply to $ ./gradlew run for starting it under ubuntu 20.4, but the build fails. Here is the stacktrace:

    $ ./gradlew run --stacktrace
    > Task :run FAILED
    Error: Could not find or load main class MainKt
    Caused by: java.lang.ClassNotFoundException: MainKt
    
    FAILURE: Build failed with an exception.
    
    * What went wrong:
    Execution failed for task ':run'.
    > Process 'command '/usr/lib/jvm/java-17-openjdk-amd64/bin/java'' finished with non-zero exit value 1
    
    * Try:
    > Run with --info or --debug option to get more log output.
    > Run with --scan to get full insights.
    
    * Exception is:
    org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':run'.
            at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:145)
            at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:282)
            at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:143)
            at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:131)
            at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:77)
            at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
            at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
            at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
            at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
            at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
            at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
            at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
            at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
            at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
            at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
            at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
            at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
            at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
            at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
            at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
            at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
            at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
            at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:74)
            at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:402)
            at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:389)
            at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:382)
            at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:368)
            at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)
            at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
            at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
            at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
            at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
            at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
            at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:61)
    Caused by: org.gradle.process.internal.ExecException: Process 'command '/usr/lib/jvm/java-17-openjdk-amd64/bin/java'' finished with non-zero exit value 1
            at org.gradle.process.internal.DefaultExecHandle$ExecResultImpl.assertNormalExitValue(DefaultExecHandle.java:414)
            at org.gradle.process.internal.DefaultJavaExecAction.execute(DefaultJavaExecAction.java:52)
            at org.gradle.api.tasks.JavaExec.exec(JavaExec.java:158)
            at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
            at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:104)
            at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:58)
            at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51)
            at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29)
            at org.gradle.api.internal.tasks.execution.TaskExecution$2.run(TaskExecution.java:239)
            at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
            at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
            at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
            at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
            at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
            at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
            at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
            at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)
            at org.gradle.api.internal.tasks.execution.TaskExecution.executeAction(TaskExecution.java:224)
            at org.gradle.api.internal.tasks.execution.TaskExecution.executeActions(TaskExecution.java:207)
            at org.gradle.api.internal.tasks.execution.TaskExecution.executeWithPreviousOutputFiles(TaskExecution.java:190)
            at org.gradle.api.internal.tasks.execution.TaskExecution.execute(TaskExecution.java:168)
            at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:89)
            at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:40)
            at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:53)
            at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:50)
            at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
            at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
            at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
            at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
            at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
            at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
            at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
            at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
            at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:50)
            at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:40)
            at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:68)
            at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:38)
            at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:48)
            at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:36)
            at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:41)
            at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:74)
            at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55)
            at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:51)
            at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:29)
            at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:61)
            at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:42)
            at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:60)
            at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:27)
            at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:188)
            at org.gradle.internal.execution.steps.BuildCacheStep.lambda$execute$1(BuildCacheStep.java:75)
            at org.gradle.internal.Either$Right.fold(Either.java:175)
            at org.gradle.internal.execution.caching.CachingState.fold(CachingState.java:59)
            at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:73)
            at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:48)
            at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:38)
            at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:27)
            at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:36)
            at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:22)
            at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:109)
            at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$2(SkipUpToDateStep.java:56)
            at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:56)
            at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:38)
            at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:73)
            at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:44)
            at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37)
            at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27)
            at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:89)
            at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:50)
            at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:114)
            at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:57)
            at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:76)
            at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:50)
            at org.gradle.internal.execution.steps.SkipEmptyWorkStep.lambda$execute$2(SkipEmptyWorkStep.java:93)
            at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:93)
            at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:34)
            at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38)
            at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:43)
            at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:31)
            at org.gradle.internal.execution.steps.AssignWorkspaceStep.lambda$execute$0(AssignWorkspaceStep.java:40)
            at org.gradle.api.internal.tasks.execution.TaskExecution$3.withWorkspace(TaskExecution.java:284)
            at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:40)
            at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:30)
            at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:37)
            at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:27)
            at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:44)
            at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:33)
            at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:76)
            at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:142)
            at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:131)
            at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:77)
            at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
            at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
            at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
            at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
            at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
            at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
            at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
            at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
            at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
            at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
            at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
            at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
            at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
            at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
            at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
            at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
            at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
            at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:74)
            at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:402)
            at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:389)
            at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:382)
            at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:368)
            at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)
            at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
            at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
            at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
            at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
            at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
            at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:61)
    
    
    * Get more help at https://help.gradle.org
    
    BUILD FAILED in 842ms
    6 actionable tasks: 1 executed, 5 up-to-date
    ` ``
    
    
    opened by derVedro 8
  • Change scanner not picking up files in index

    Change scanner not picking up files in index

    For some reason if a file is externally added and put into the index (usually via my IDE prompting to "Add file to git") the scanner will not pick up that this file now exists and the state should be updated...

    bug HIGH PRIORITY 
    opened by codymikol 3
  • Cannot handle live branch changes

    Cannot handle live branch changes

    Currently nothing handles the active branch it seems, it will be stuck on the previous branch and then crash on attempting to stage / unstage changes.

    Not entirely sure about this, I saw it happen just now, but could be something else...

    HIGH PRIORITY 
    opened by codymikol 2
  • bug(welcome): welcome screen goes to background after closing commit view

    bug(welcome): welcome screen goes to background after closing commit view

    Currently, if you close the commit / graph / stash view, you will be sent back to the welcome screen, but it will be sent behind all existing windows where you can't see it. It should instead be set as the current active window.

    HIGH PRIORITY 
    opened by codymikol 1
  • Figure out a proper way to live update GitDown

    Figure out a proper way to live update GitDown

    This was removed because it was just reassigning state on an interval which was more expensive than it needed to be, and caused a ton of jank when using the UI / scrolling around.

    We'll need a way to determine if there is a need to refresh before we do it.

    opened by codymikol 1
  • Retain last directory from selection in directory selector

    Retain last directory from selection in directory selector

    When we select a directory, we should default to the last folder that a user was in when they select a project to open. In my and probably many cases, it is common to have a "projects" folder that contains many git repos.

    enhancement MEDIUM PRIORITY 
    opened by codymikol 1
  • Directory Selector does not work in Linux / Windows

    Directory Selector does not work in Linux / Windows

    There is a special system level hack for mac that is currently used to allow us to select directories rather than files

    System.setProperty("apple.awt.fileDialogForDirectories", "true")

    We either need to find a way to generically do this OS agnostic or add the needed hacks for each OS :shrug:

    opened by codymikol 1
  • fix(commit): handle empty newly initialized repos

    fix(commit): handle empty newly initialized repos

    this fixes a bug where the commit count derived state was encountering an exception. Now we will explicitly handle this and return 0 commits.

    Fixes #28

    opened by codymikol 0
  • feat(commit): don't squish stage / unstage file

    feat(commit): don't squish stage / unstage file

    this prevents an issue where the stage / unstage file button would get clipped out of frame if the file path is too long. We still need to find a way to do a reverse ellipse, but I feel this is part of another issue.

    Fixes #87

    opened by codymikol 0
  • When selecting a non git directory, nothing happens

    When selecting a non git directory, nothing happens

    We should bring the user to a screen that will allow them to start a new git repository.

    Maybe we can allow them to choose files / directories to ignore as well

    MEDIUM PRIORITY 
    opened by codymikol 0
  • Race condition after leaving editor

    Race condition after leaving editor

    Sometimes when leaving the editor, temporary files are created / deleted. Because the editor scans for changes on pulling focus, this can lead to the temporary files showing up.

    Might be better to have the best of both worlds, we turn on a file watcher while the window has focus and turn it off when it goes in the background

    bug HIGH PRIORITY 
    opened by codymikol 0
Owner
Cody Mikol
Cody Mikol
A multi-platform Collins Dictionary client, supports for Desktop(Windows/Linux/MacOS) and Android.

Collins Dictionary This is a multi-platform Collins Dictionary client, supports for Desktop(Windows/Linux/MacOS) and Android. For Linux and MacOS, ple

KonYaco 57 Dec 30, 2022
Android library for finding connected devices on same WiFi network. It can provide IP Address, device name, MAC Address and vendor names.

Android WiFi Tools Android library for finding connected devices on the same WiFi network. It can provide IP Addresses, device names, MAC Address and

Tej Magar 5 Nov 16, 2022
This little project provides Kotlin bindings for the popular tree-sitter library

kotlintree This little project provides Kotlin bindings for the popular tree-sitter library. Currently it only supports the Kotlin JVM target, but Kot

Christian Banse 23 Nov 28, 2022
An android app to browse KDE Store and other Linux Desktop Environment stores of Pling

A free and open source android application for browsing KDE Store and other Linux Desktop Environment's Stores in Pling. Couldn't check it in different devices so there could be some bugs. Bug Report and Feedbacks are highly appreciated.

null 14 Dec 27, 2022
Linux GUI for Kuri's userspace tablet drivers. Supports non-wacom (XP-Pen, Huion, Gaomon) graphics tablets and pen displays

Kuri's Userspace tablet driver utility (GUI) This is a new GUI implementation for the userland driver I've written here: https://github.com/kurikaesu/

Aren Villanueva 12 Jan 4, 2023
Termux - an Android terminal application and Linux environment

Termux application Termux is an Android terminal application and Linux environment. Note that this repository is for the app itself (the user interfac

Termux 18.4k Jan 3, 2023
Andorid app which provides a bunch of useful Linux commands.

Linux Command Library for Android The app currently has 3203 manual pages, 1351 one-line scripts and a bunch of general terminal tips. It works 100% o

Simon Schubert 285 Jan 3, 2023
FairEmail is easy to set up and works with virtually all email providers, including Gmail, Outlook and Yahoo!

Downloads • Privacy • Support • License FairEmail Fully featured, open source, privacy oriented email app for Android FairEmail is easy to set up and

Marcel Bokhorst 1.5k Jan 2, 2023
An android app built using Kotlin that consumes TMDB API to display current trending, upcoming and popular movies 🍿 .

Flick An android app built using Kotlin that consumes TMDB API to display current trending, upcoming and popular movies ?? .It has been built followin

Kagiri Charles 8 Nov 29, 2022
Movie streaming is an android app that show us last,newest,top imdb and popular movies.

Movies-Streaming-Android-App An Android application which shows Popular, New Movies, Top Rated movies and all the details of any movie like- Cast, Rev

mojtaba joshaghani 33 Aug 25, 2022
The App Loads list of popular movies from a mock API and shows in a recyclerView

popular-movies-app About The App Loads list of popular movies from a mock API and shows in a recyclerView. Any item can be clicked to open the Movie D

Mayank Agarwal 0 Oct 30, 2021
Program, created to make popular adb and fastboot commands easier to use

Android Tool What is it? Android Tool is a powerful and beautiful program, created to make popular adb and fastboot commands easier to use. A dark the

Rodion 245 Dec 29, 2022
Movie Info - MovieInfo app that recieves popular movies and allow the user to search for specific movie through the restapi

Movie_Info MovieInfo app that recieves popular movies and allow the user to sear

inderjeet yadav 3 Jun 8, 2022
Keep track of popular & top rated movies and see movie details

Movies Keep track of popular & top rated movies and see movie details Features Keep track of popular & top rated movies See movie details Libraries Je

Amr Saraya 1 May 1, 2022
A 2020s compatible React Native keyboard avoiding view for Android and iOS that just works.

react-native-keyboard-shift Example Snack coming soon Until then: Clone this repo: git clone https://github.com/FullStackCraft/react-native-keyboard-s

Full Stack Craft 66 Aug 16, 2022
📲💬 react-native-fontext is a lightweight library to integrate fonts in your React Native application that works seamlessly in android and iOS devices.

React Native Fontext react-native-fontext is a lightweight library to integrate fonts in your React Native application that works seamlessly in androi

mroads 9 Dec 3, 2021
You can store all your password, bank details, card details in one place and remember only one master PIN. The application works totally offline.

Keep Password An application where you can store all your password, bank details, card details in one place and remember only one master PIN. The appl

rıdvan 4 Apr 18, 2022
A Kotlin Mindustry mod that works on Android and PC

Mindustry Kotlin Mod Template A Kotlin Mindustry mod that works on Android and PC. This is equivalent to the Java version, except in Kotlin. Building

Eclipse 15 Sep 24, 2022
Popular Movies showcase android app

Pop Flix PopFlix is a gorgeous client application for TMDb on Android, built using Kotlin. Architecture and Tech-stack Built on MVVM architecture patt

Vishvendra Singh 5 Jun 7, 2022