Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitattributes
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
# Auto detect text files and perform LF normalization
* text=auto
src/TestRepository/** linguist-vendored
19 changes: 19 additions & 0 deletions .github/actions/install-tokei/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
name: 'Install Tokei'
description: 'Install Tokei on Windows, Linux and Mac using Cargo'

runs:
using: 'composite'
steps:
- name: Install Tokei via Cargo
shell: bash
run: |
if ! command -v tokei &> /dev/null; then
echo "Tokei not found, installing..."
cargo install tokei
else
echo "Tokei is already installed."
fi

- name: Verify Installation
shell: bash
run: tokei --version
5 changes: 4 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ permissions:
attestations: write

jobs:
test:
uses: ./.github/workflows/test.yml

build:
runs-on: ubuntu-latest
env:
Expand All @@ -25,7 +28,7 @@ jobs:
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: '10.0.102'
dotnet-version: '10.0.x'

- name: Build vv.build and create release artifacts
run: dotnet run --project ${{ env.BUILD_PROJECT }}
Expand Down
37 changes: 37 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
name: Test

on:
push:
branches:
- 'main'
pull_request:
branches:
- '**'
workflow_dispatch:
workflow_call:


jobs:
test:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Install Tokei
uses: ./.github/actions/install-tokei

- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: '10.0.x'

- name: Restore dependencies
run: dotnet restore src/vv.sln

- name: Test
run: dotnet test src/vv.sln --no-restore
File renamed without changes.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
[![Test](https://github.com/HardCodeDev777/vv/actions/workflows/test.yml/badge.svg)](https://github.com/HardCodeDev777/vv/actions/workflows/test.yml)
[![Release](https://github.com/HardCodeDev777/vv/actions/workflows/release.yml/badge.svg)](https://github.com/HardCodeDev777/vv/actions/workflows/release.yml)

# vv
Expand Down
12 changes: 12 additions & 0 deletions src/TestRepository/Program.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using System;

namespace HelloWorld
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
}
}
}
2 changes: 2 additions & 0 deletions src/TestRepository/gitignore.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
test.sh
test.bat
2 changes: 2 additions & 0 deletions src/TestRepository/test.bat
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
@echo off
echo HelloWorld
2 changes: 2 additions & 0 deletions src/TestRepository/test.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#!/bin/bash
echo "HelloWorld"
16 changes: 15 additions & 1 deletion src/src.sln → src/vv.sln
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 18
VisualStudioVersion = 18.3.11312.210 d18.3
VisualStudioVersion = 18.3.11312.210
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "vv", "vv\vv.csproj", "{54B35286-309C-483A-AF2C-E144A39B1765}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "vv.build", "vv.build\vv.build.csproj", "{F4100060-5C7B-473D-AA5C-28076DC3A96C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "vv.tests", "vv.tests\vv.tests.csproj", "{6EC4ED7D-55C8-4975-8F21-60A3E56C482D}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -41,6 +43,18 @@ Global
{F4100060-5C7B-473D-AA5C-28076DC3A96C}.Release|x64.Build.0 = Release|Any CPU
{F4100060-5C7B-473D-AA5C-28076DC3A96C}.Release|x86.ActiveCfg = Release|Any CPU
{F4100060-5C7B-473D-AA5C-28076DC3A96C}.Release|x86.Build.0 = Release|Any CPU
{6EC4ED7D-55C8-4975-8F21-60A3E56C482D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6EC4ED7D-55C8-4975-8F21-60A3E56C482D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6EC4ED7D-55C8-4975-8F21-60A3E56C482D}.Debug|x64.ActiveCfg = Debug|Any CPU
{6EC4ED7D-55C8-4975-8F21-60A3E56C482D}.Debug|x64.Build.0 = Debug|Any CPU
{6EC4ED7D-55C8-4975-8F21-60A3E56C482D}.Debug|x86.ActiveCfg = Debug|Any CPU
{6EC4ED7D-55C8-4975-8F21-60A3E56C482D}.Debug|x86.Build.0 = Debug|Any CPU
{6EC4ED7D-55C8-4975-8F21-60A3E56C482D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6EC4ED7D-55C8-4975-8F21-60A3E56C482D}.Release|Any CPU.Build.0 = Release|Any CPU
{6EC4ED7D-55C8-4975-8F21-60A3E56C482D}.Release|x64.ActiveCfg = Release|Any CPU
{6EC4ED7D-55C8-4975-8F21-60A3E56C482D}.Release|x64.Build.0 = Release|Any CPU
{6EC4ED7D-55C8-4975-8F21-60A3E56C482D}.Release|x86.ActiveCfg = Release|Any CPU
{6EC4ED7D-55C8-4975-8F21-60A3E56C482D}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down
51 changes: 51 additions & 0 deletions src/vv.tests/Tests/AdvancedEnumerateTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
using LibGit2Sharp;
using System.Runtime.InteropServices;
using vv.Core;

namespace vv.tests;

public class AdvancedEnumerateTest
{
[Fact]
public void TestEnumerate()
{
var tempDir = Directory.CreateTempSubdirectory();
var root = tempDir.FullName;

// Duck mac
if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
{
root = Path.GetFullPath(new DirectoryInfo(tempDir.FullName).FullName);
if (!root.StartsWith("/private"))
root = "/private" + root;
}

try
{
Directory.CreateDirectory(Path.Combine(root, "src"));
Directory.CreateDirectory(Path.Combine(root, "bin"));

File.WriteAllText(Path.Combine(root, "src", "a.cs"), "");
File.WriteAllText(Path.Combine(root, "bin", "b.exe"), "");

File.WriteAllText(Path.Combine(root, ".gitignore"), "bin/\n");

Repository.Init(root);
using var repo = new Repository(root);

var checkedDirs = new List<string>();

AdvancedEnumerate.Walk(root, repo, true,
onEntryDir: d => checkedDirs.Add(Path.GetFileName(d)),
_ => { }, _ => { }
);

Assert.Contains("src", checkedDirs);
Assert.DoesNotContain("bin", checkedDirs);
}
finally
{
Directory.Delete(root, true);
}
}
}
30 changes: 30 additions & 0 deletions src/vv.tests/Tests/SetupTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
using LibGit2Sharp;
using vv.Core;

namespace vv.tests;

public class SetupTest
{
[Fact]
public void TestGettingRepos()
{
var root = Directory.CreateTempSubdirectory().FullName;
try
{
File.WriteAllText(Path.Combine(root, "a.cs"), "");
Repository.Init(root);

var reposFolderPath = Directory.GetParent(root).FullName;
SetupHandle.WriteSetupToJson(new(reposFolderPath));

var reposNames = SetupHandle.GetRepositoriesNamesFromSetup();

Assert.Contains(Path.GetFileName(root), reposNames);
}
finally
{
File.Delete(SetupHandle.SetupFilePath);
Directory.Delete(root, true);
}
}
}
61 changes: 61 additions & 0 deletions src/vv.tests/Tests/TokeiTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
using vv.tests.Utils;
using vv.Core;

namespace vv.tests;

public class TokeiTest
{
[Fact]
public async Task TestWithIgnore()
{
var repoPath = string.Empty;
try
{
var testRepo = TempRepo.CreateTempRepository(out repoPath);

var outputJson = await Tokei.ManageProcess(repoPath, true);
var data = Tokei.ParseLanguageData(outputJson);

Assert.NotNull(data);
Assert.NotEmpty(data);

var langsNames = new List<string>();
foreach (var langData in data)
langsNames.Add(langData.Name);

Assert.Contains("C#", langsNames);
Assert.DoesNotContain("Batch", langsNames);
}
finally
{

if (!string.IsNullOrEmpty(repoPath))
TempRepo.DeleteTempRepository(repoPath);
}
}

[Fact]
public async Task TestWithoutIgnore()
{
var repoPath = string.Empty;
try
{
var testRepo = TempRepo.CreateTempRepository(out repoPath);

var outputJson = await Tokei.ManageProcess(repoPath, false);
var data = Tokei.ParseLanguageData(outputJson);

var langsNames = new List<string>();
foreach (var langData in data)
langsNames.Add(langData.Name);

Assert.Contains("Batch", langsNames);
}

finally
{
if (!string.IsNullOrEmpty(repoPath))
TempRepo.DeleteTempRepository(repoPath);
}
}
}
42 changes: 42 additions & 0 deletions src/vv.tests/Utils/TempRepo.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
using LibGit2Sharp;

namespace vv.tests.Utils;

internal static class TempRepo
{
public static Repository CreateTempRepository(out string repoPath)
{
var templateRepoPath = Path.GetFullPath(Path.Combine(
new DirectoryInfo(AppContext.BaseDirectory).Parent.Parent.FullName, "TestRepository"));

var tempRepoPath = Directory.CreateTempSubdirectory().FullName;
Console.WriteLine($"Temp repository path: {tempRepoPath}");

foreach(var filePath in Directory.GetFiles(templateRepoPath))
{
var fileName = Path.GetFileName(filePath);
File.Copy(Path.Combine(templateRepoPath, fileName), Path.Combine(tempRepoPath, fileName));
}

File.Copy(Path.Combine(templateRepoPath, "gitignore.txt"), Path.Combine(tempRepoPath, ".gitignore"));

Repository.Init(tempRepoPath);
using var repo = new Repository(tempRepoPath);

repoPath = tempRepoPath;
return repo;
}

public static void DeleteTempRepository(string repoPath)
{
var directory = new DirectoryInfo(repoPath);

foreach (var file in directory.GetFiles("*", SearchOption.AllDirectories))
file.Attributes = FileAttributes.Normal;

foreach (var dir in directory.GetDirectories("*", SearchOption.AllDirectories))
dir.Attributes = FileAttributes.Normal;

directory.Delete(true);
}
}
30 changes: 30 additions & 0 deletions src/vv.tests/vv.tests.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
<SatelliteResourceLanguages>none</SatelliteResourceLanguages>
<Nullable>disable</Nullable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.1" />
<PackageReference Include="xunit" Version="2.9.3" />
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.5">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\vv\vv.csproj" />
</ItemGroup>

<ItemGroup>
<Using Include="Xunit" />
</ItemGroup>

<ItemGroup>
<None Update="TestData\**\*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>
7 changes: 2 additions & 5 deletions src/vv/CLI/Commands/Languages/LanguagesCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,13 @@ await DefaultRendering.Spinner("Starting processing...", async ctx =>
}

ctx.Status("Running tokei...");
await Tokei.ManageProcess(repoPath, !settings.DisrespectGitIgnore);
var jsonOutput = await Tokei.ManageProcess(repoPath, !settings.DisrespectGitIgnore);

ctx.Status("Parsing tokei output...");
var langsData = Tokei.ParseLanguageData();
var langsData = Tokei.ParseLanguageData(jsonOutput);

ctx.Status("Running founded languages from languages.yml ...");
fullLangsData = LanguagesYml.GetLangsColors(langsData, settings.IgnoreDocsLangs);

ctx.Status("Deleting cache...");
Tokei.DeleteGeneratedCache();
});

AnsiConsole.WriteLine();
Expand Down
Loading